package zdori;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

	/*
	 * 콜랙션
	 * 객체지향 기반 프로그램 작성시 종종 같은 종류의 객체의 묶음 group이나 다른 종류의 객체 묶음을 함께 쓰는 때가 있음
	 * 
	 * 앞서 배운 배열은 같은 종류의 객체 묶음 이지만 유연성이 부족하고, 크기 조정도 안되고 다른 종류의 객체도 가질 수 없음
	 * 
	 * 다행히 자바에는 이러한 종류의 객체를 쉽게 다룰 수 있는 인터페이스와 클래스를 제공
	 * 그것이 바로 collection 프레임 워크임
	 * 
	 * collection은 다른 종류로 구성된 객체의 묶음을 의미
	 * 또 다른 말로 용기 container 라고도 하는데,
	 * 각 요소를 저장, 검색, 조작하는 메서드를 제공
	 * 
	 * collection <- Set,List,Queue
	 * List <- ArrayList
	 * Map <- AbstractMap,SortedMap
	 * AbstratMap <- HashMap
	 * Iterator,Comparatior
	 * 
	 * 이들 대부분은 java.util 패키지에 포함됨
	 * 
	 * List - 동적 배열
	 * Collection위 가장 인기있는 하위 인터페이스임
	 * ArrayList는 List의 가장 자주 사용하는 구현 클래스
	 * List는 자료를 순서대로 저장하는 특성을 가짐
	 * FIFO: first in first out 선입선출
	 * 또한 데이터를 중복으로 저장가능
	 * 단 Set은 중복이 허용되지 않음
	 * add 메서드를 통해 데이터를 List의 맨끝에 추가
	 * 
	 * 
	 */
	
	public static void main(String[] args) {
		List a = new ArrayList();
		a.add("가나다");
		a.add(1324);
		System.out.println(a);
		//ArrayList에 저장된 객체를 하나씩 꺼내 출력
		System.out.println(a.get(0));
		System.out.println(a.get(1));
		
		//변수에 따로 저장
		//이유 : arraylist에 객체를 저장할 때는 대상이 무엇이든 간에 무조건 object 형으로 저장됨 
		//따라서 ArrayList 에 저장된 객체를 꺼낼때는
		//객체의 자료형에 맞춰 downcasting 이 필요(jdk5 이전)
		//int num = (int)a.get(0);
		//char chr = (char)a.get(1);
		//float floatnum = (float)a.get(2);
		
		//하지만 이렇게 해도 일단 오류는 x
		//실행하면 비로소 오류가 뜸
		//이런 종류의 오류는 찾기 힘듬
		char num2 = (char) a.get(0);//int
		Integer intg = (Integer)a.get(1);//String
		
		//제네릭 generic
		//콜렉션을 배울때 제네릭을 빼놓으면
		//불완전하게 콜렉션을 배우는 것임
		//콜렉션을 사용할 때 발생 할 수 있는 컴파일 시간때 엄격한 자료형을 검사를 지원
		//또한 C++ 에서 제공하는 클래스 템플릿을 작성할 수 있게 해줌(고급)
		
		//제네릭에서는 매개변수 자료형parameterizde type 을 이용해서 콜렉션 요소의 자료형을 지정함
		//메서드의 매개변수는 ()안에 사용하는 것처럼
		//콜렉션에서는<>안에 매개변수 자료형을 사용
		//List<String> result = null;
		
		//제네릭을 사용했을 경우
		List<String> abc = new ArrayList<String>();
		//List<String> abc = new ArrayList<>();//jdk 7
		//자료형 검사후 오류 표시
		//abc라는 콜렉션(동적배열)에는
		//String 형식의 값만 추가할 수 있다는 의미
		
		abc.add("123");
		
		List<J03_MemberVO> result = new ArrayList<J03_MemberVO>();
		
	}
	
	

}
